package com.ts.api.common.util;

import com.gitee.apanlh.util.base.ChooseOr;
import com.gitee.apanlh.util.valid.Assert;
import com.gitee.apanlh.util.valid.ValidParam;
import com.ts.api.common.constant.api.ApiEnum;
import com.ts.api.common.localcache.DistrictCache;
import com.ts.api.exp.ApiMsgException;
import com.ts.api.module.common.entity.DistrictPO;

import java.math.BigDecimal;

/**
 *  API字典字段映射
 *
 *  @author Pan
 */
public class ApiDictUtils {

    /**
     *  转换芝麻分
     *
     *  @param  number   Long/Integer数值或String数值
     *  @return String   字典序号
     */
    public static String convertSesameCredit(Object number) {
        Integer value = getInt(number);
        if (ValidParam.isNull(value)) {
            return null;
        }

        String choose = ChooseOr.create(value <= 600, "1")
            .orElseIf(value > 600 && value <= 649, "2")
            .orElseIf(value > 649 && value <= 699, "3")
        .orElse("4");
        return choose;
    }

    /**
     *  转换年龄
     *
     *  @param  number   Long/Integer数值或String数值
     *  @return String   字典序号
     */
    public static String convertAge(Object number) {
        Integer value = getInt(number);
        Assert.isNotNullThrows(value, new ApiMsgException(ApiEnum.API_RECEIVE_CONVERT_ERROR.format("年龄", "null")));
        return value.toString();
    }

    /**
     *  转换月收入
     *
     *  @param  number   Long/Integer数值或String数值
     *  @return String   字典序号
     */
    public static String convertMonthlySalary(Object number) {
        Integer value = getInt(number);
        if (ValidParam.isNull(value)) {
            return null;
        }

        String choose = ChooseOr.create(value > 1000 && value <= 3000, "1")
            .orElseIf(value > 3000 && value <= 8000, "2")
            .orElseIf(value > 8000 && value <= 15000, "3")
            .orElseIf(value > 15000 && value <= 30000, "4")
            .orElseIf( value > 30000, "5")
        .getChoose();
        return choose;
    }

    /**
     *  转换借款期限
     *
     *  @param  number   Long/Integer数值或String数值
     *  @return String   字典序号
     */
    public static String convertLoanTerm(Object number) {
        Integer value = getInt(number);
        if (ValidParam.isNull(value)) {
            return null;
        }

        String choose = ChooseOr.create(value > 0 && value <= 3, "1")
                .orElseIf(value > 3 && value <= 6, "2")
                .orElseIf(value > 6 && value <= 12, "3")
                .orElseIf(value > 12 && value <= 24, "4")
                .orElseIf(value > 24 && value <= 36, "5")
                .orElseIf(value > 36 && value <= 60, "6")
                .orElseIf( value > 60, "6")
                .getChoose();
        return choose;
    }

    /**
     *  转换总经营流水
     *
     *  @param  number   Long/Integer数值或String数值
     *  @return String   字典序号
     */
    public static String convertBizBankDetails(Object number) {
        Integer value = getInt(number);
        if (ValidParam.isNull(value)) {
            return null;
        }

        String choose = ChooseOr.create(value > 100000 && value <= 500000, "1")
            .orElseIf(value > 500000 && value <= 1000000, "2")
            .orElseIf(value > 1000000 && value <= 5000000, "3")
        .getChoose();
        return choose;
    }

    /**
     *  转换学历
     *
     *  @param  str
     *  @return String   字典序号
     */
    public static String convertEducationAttainment(String str) {
        if (ValidParam.isNull(str)) {
            return null;
        }

        String choose = ChooseOr.create(str.contains("初中"), "1")
            .orElseIf(str.contains("中专"), "2")
            .orElseIf(str.contains("高中"), "3")
            .orElseIf(str.contains("专科"), "4")
            .orElseIf(str.contains("本科"), "5")
            .orElseIf(str.contains("大学"), "5")
            .orElseIf(str.contains("研究生"), "6")
            .orElseIf(str.contains("硕士"), "6")
            .orElseIf(str.contains("博士"), "6")
        .orElse("1");
        return choose;
    }

    /**
     *  转换贷款金额
     *
     *  @param  number   Long/Integer数值或String数值
     *  @param  isFull   true则全金额
     *  @return String   字典序号
     */
    public static String convertLoanAmount(String number, boolean isFull) {
        BigDecimal bigDecimalValue = new BigDecimal(number);
        // 转换为整数类型（取整）
        int value = bigDecimalValue.intValue();
        if (ValidParam.isNull(value)) {
            return null;
        }
        //  全金额
        if (isFull) {
            String choose = ChooseOr.create(value <= 30000, "1")
                .orElseIf(value >= 50000 & value <= 100000, "2")
                .orElseIf(value > 100000 && value <= 200000, "3")
                .orElseIf(value > 200000, "4")
            //  如果缺失挡位就归为类2
            .orElse("2");
            return choose;
        }
        //  自行截取金额
        String choose = ChooseOr.create(value <= 3, "1")
            .orElseIf(value >= 5 & value <= 10, "2")
            .orElseIf(value > 10 && value <= 20, "3")
            .orElseIf(value > 20, "4")
        //  如果缺失挡位就归为类2
        .orElse("2");
        return choose;
    }

    /**
     *  转换数值方法
     *
     *  @param  number
     *  @return Integer
     */
    private static Integer getInt(Object number) {
        if (number == null) {
            return null;
        }
        Integer value = null;

        if (number instanceof Number) {
            value = ((Number) number).intValue();
        }
        if (number instanceof String) {
            value = Integer.valueOf((String) number);
        }
        return value;
    }

    /**
     *  根据地区名称来获取正确城市名称
     *  如果不存在将抛出异常ApiMsgException
     *
     *  @param  city    城市名称
     *  @throws ApiMsgException
     */
    public static String getAreaNameByName(String city) {
        DistrictPO districtPO = DistrictCache.getByName(city);
        Assert.isNotNullThrows(districtPO, new ApiMsgException(ApiEnum.API_RECEIVE_AREA_ERROR.format(city)));
        return districtPO.getName();
    }

    /**
     *
     *  根据地区编码来获取正确城市名称
     *  如果不存在将抛出异常ApiMsgException
     *
     *  @param  cityCode    城市编码
     *  @throws ApiMsgException
     */
    public static String getAreaNameByCode(String cityCode) {
        DistrictPO districtPO = DistrictCache.getByCode(cityCode);
        Assert.isNotNullThrows(districtPO, new ApiMsgException(ApiEnum.API_RECEIVE_AREA_ERROR.format(cityCode)));
        return districtPO.getName();
    }
}
